#include "EventLoop.hpp"
#include <mutex>
#include <condition_variable>

class LoopThread
{
private:
    /*用于实现_loop获取的同步关系，避免线程创建了，但是_loop还没有实例化之前就获取_loop了*/
    std::mutex _mutex;
    std::condition_variable _cond;
    EventLoop *_loop;    // EventLoop对象指针变量-这个对象需要在线程内实例化
    std::thread _thread; // EventLoop对应的线程

private:
    /*实例化EventLoop对象，唤醒_cond上有可能阻塞的线程，并开始运行EventLoop模块的功能*/
    void ThreadEntry()
    {
        EventLoop loop;
        {
            std::unique_lock<std::mutex> lock(_mutex);
            _loop = &loop;
            _cond.notify_all(); //唤醒
        }
        loop.Start();
    }

public:
    /*创建线程，设定线程入口函数*/
    LoopThread() :_loop(nullptr), _thread(std::thread(&LoopThread::ThreadEntry, this)){}
    // 返回当前线程关联的EventLoop对象指针
    EventLoop *GetLoop()
    {
        EventLoop *loop = nullptr;
        {
            std::unique_lock<std::mutex> lock(_mutex); //加锁
            _cond.wait(lock, [&](){return _loop != nullptr; }); //loop为空就一直阻塞
            loop = _loop;
        }
        return loop;
    }
};